package com.doitedu.core2

import com.alibaba.fastjson.JSON
import com.doitedu.beans.UserBean
import com.doitedu.utils.SparkUtil
import org.apache.spark.SparkContext

/**
 * @Date: 22.7.2 
 * @Author: HANGGE
 * @qq: 598196583
 * @Tips: 学大数据 ,到多易教育
 * @Description:
 */
object C01_闭包 {
  def main(args: Array[String]): Unit = {

    val sc = SparkUtil.getSparkContext("闭包")
    val rdd = sc.textFile("data/user")
    // 转换算子  函数
    // 函数的执行在worker端
    //val user = new UserBean(1, "SAFD", "DSFS&^%F", "VIP6", "1888888888")
    // --->1 Driver 端定义
    val user = new User(1, "zss") with Serializable
    /**
     * rdd没有执行行动撒子  ,计算的RDD根本不会触发计算
     * rdd算子引用的外部变量  应该没有进行网络传输 但是报错Task not serializable
     *   叫做闭包检测
     *
     * 函数 --->  封装在Task中   在封装Task之前会对函数进行闭包检测 , 检测闭包是否可以序列化
     * map(f) { -->
     *    clean(F) -->
     *      -->  checkSerializable: Boolean = true,
     * }
     *
     */

    val mapRDD = rdd.map(line => {
      try {
        // -->2 Executor端使用 对象要序列化   Task not serializable
       println(user)
        val bean = JSON.parseObject(line, classOf[UserBean])
        bean
      } catch {
        case e: Exception => {
         // println(i)
          null
        }
      }
    })


  //  mapRDD.take(9)
    sc.stop()





  }


}

class  User (val id:Int , val name:String) {

  override def toString = s"User($id, $name)"
}